Array.prototype.sort() 您所在的位置:网站首页 js map会改变原数组吗 Array.prototype.sort()

Array.prototype.sort()

#Array.prototype.sort()| 来源: 网络整理| 查看: 265

如果没有提供 compareFn,所有非 undefined 的数组元素都会被转换为字符串,并按照 UTF-16 码点顺序比较字符串进行排序。例如“banana”会被排列到“cherry”之前。在数值排序中,9 出现在 80 之前,但因为数字会被转换为字符串,在 Unicode 顺序中“80”要比“9”要靠前。所有的 undefined 元素都会被排序到数组的末尾。

sort() 方法保留空槽。如果源数组是稀疏的,则空槽会被移动到数组的末尾,并始终排在所有 undefined 元素的后面。

备注: 在 UTF-16 中,Unicode 字符超出 \uFFFF 的范围会被编码为两个代理码元(surrogate code unit),这些码位的范围是 \uD800 到 \uDFFF。每个码位的值都会被单独考虑进行比较。因此,由代理对 \uD855\uDE51 组成的字符将排在字符 \uFF3A 的前面。

如果提供了 compareFn,所有非 undefined 的数组元素都会按照比较函数的返回值进行排序(所有的 undefined 元素都会被排序到数组的末尾,并且不调用 compareFn)。

compareFn(a, b) 返回值 排序顺序 > 0 a 在 b 后,如 [b, a] < 0 a 在 b 前,如 [a, b] === 0 保持 a 和 b 原来的顺序

所以,比较函数形式如下:

function compareFn(a, b) { if (根据排序标准,a 小于 b) { return -1; } if (根据排序标准,a 大于 b) { return 1; } // a 一定等于 b return 0; }

更正式地说,为了确保正确的排序行为,比较函数应具有以下属性:

纯函数:比较函数不会改变被比较的对象或任何外部状态。(这很重要,因为无法保证比较函数将在何时以及如何调用,因此任何特定的调用都不应对外部产生可见的效果。) 稳定性:比较函数对于相同的输入对应始终返回相同的结果。 自反性:compareFn(a, a) === 0。 反对称性:compareFn(a, b) 和 compareFn(b, a) 必须都是 0 或者具有相反的符号。 传递性:如果 compareFn(a, b) 和 compareFn(b, c) 都是正数、零或负数,则 compareFn(a, c) 的符号与前面两个相同。

符合上述限制的比较函数将始终能够返回 1、0 和 -1 中的任意一个,或者始终返回 0。例如,如果比较函数只返回 1 和 0,或者只返回 0 和 -1,它将无法可靠地排序,因为反对称性被破坏了。一个总是返回 0 的比较函数将不会改变数组,但仍然是可靠的。

默认的字典比较函数符合上述所有限制。

要比较数字而非字符串,比较函数可以简单的用 a 减 b,如下的函数将会将数组升序排列(如果它不包含 Infinity 和 NaN):

function compareNumbers(a, b) { return a - b; }

sort() 方法是通用的,它只期望 this 值具有 length 属性和整数键属性。虽然字符串也类似于数组,但此方法不适用于字符串,因为字符串是不可变的。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有